home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et-2_2.lha / et2.2 / src / Dialog.C < prev    next >
C/C++ Source or Header  |  1990-12-04  |  8KB  |  424 lines

  1. //$DialogView,Dialog$
  2. #include "Dialog.h"
  3. #include "Buttons.h"
  4. #include "OrdColl.h"
  5. #include "Menu.h"
  6. #include "Error.h"
  7. #include "CmdNo.h"
  8. #include "Window.h"
  9.  
  10. //---- DialogView -------------------------------------------------------------
  11.  
  12. AbstractMetaImpl(DialogView, (TP(dialogRoot), TP(kbdFocusItems),
  13.         TP(kbdFocus), TP(defaultButton), TB(modified), TP(menu), 0));
  14.  
  15. DialogView::DialogView(EvtHandler *eh) : View(eh, Point(3000))
  16. {
  17.     dialogRoot= 0;
  18.     modified= TRUE;
  19.     kbdFocus= 0;
  20.     kbdFocusItems= 0;
  21.     defaultButton= 0;
  22.     menu= 0;
  23.     SetFlag(eViewNoPrint);
  24. }
  25.  
  26. DialogView::~DialogView()
  27. {
  28.     if (dialogRoot) {
  29.     dialogRoot->FreeAll();
  30.     SafeDelete(dialogRoot);
  31.     }
  32.     SafeDelete(kbdFocusItems);
  33. }
  34.  
  35. void DialogView::Open(bool mode)
  36. {
  37.     View::Open(mode);
  38.     if (mode)
  39.     Update();
  40.     if (dialogRoot)
  41.     dialogRoot->Open(mode);
  42. }
  43.  
  44. void DialogView::SetContainer(VObject *c)
  45. {
  46.     View::SetContainer(c);
  47.     if (dialogRoot)
  48.     dialogRoot->SetContainer(this);
  49. }
  50.  
  51. VObject *DialogView::DoCreateDialog()
  52. {
  53.     return 0;
  54. }
  55.  
  56. Metric DialogView::GetMinSize()
  57. {
  58.     Update();
  59.     return dialogRoot->GetMinSize();
  60. }
  61.  
  62. VObject *DialogView::SetDialog(VObject *dia, bool redraw)
  63. {
  64.     VObject *olddialog= 0;
  65.     if (dia) {
  66.     olddialog= dialogRoot;
  67.     dialogRoot= dia;
  68.     dialogRoot->SetContainer(this);
  69.     dialogRoot->Enable();
  70.     dialogRoot->SendDown(cIdEndKbdFocus, cPartFocusChanged, (void*)TRUE);
  71.     if (kbdFocus)
  72.         kbdFocus->SendDown(cIdStartKbdFocus, cPartFocusChanged, (void*)TRUE);
  73.     CalcLayout(redraw);
  74.     }
  75.     return olddialog;
  76. }
  77.  
  78. void DialogView::SetOrigin(Point at)
  79. {
  80.     View::SetOrigin(at);
  81.     if (dialogRoot) 
  82.     dialogRoot->SetOrigin(at);
  83. }
  84.  
  85. void DialogView::SetExtent(Point e)
  86. {
  87.     View::SetExtent(e);
  88.     if (dialogRoot) 
  89.     dialogRoot->SetExtent(e);
  90. }
  91.  
  92. void DialogView::CalcLayout(bool redraw)
  93. {
  94.     if (dialogRoot) {
  95.     dialogRoot->CalcExtent();
  96.     SetFlag(eVObjHFixed, dialogRoot->TestFlag(eVObjHFixed));
  97.     SetFlag(eVObjVFixed, dialogRoot->TestFlag(eVObjVFixed));
  98.     dialogRoot->SetOrigin(GetOrigin());
  99.     View::SetExtent(dialogRoot->GetExtent());
  100.     if (redraw)
  101.         ForceRedraw();
  102.     }
  103. }
  104.  
  105. void DialogView::Update()
  106. {
  107.     if (modified) {
  108.     if (dialogRoot)
  109.         CalcLayout();
  110.     else
  111.         SetDialog(DoCreateDialog(), FALSE);
  112.  
  113.     //if (kbdFocus) 
  114.     //    kbdFocus->SendDown(cIdStartKbdFocus, cPartFocusChanged, (void*)TRUE);
  115.     modified= FALSE;
  116.     }    
  117. }
  118.  
  119. void DialogView::Control(int id, int part, void *val)
  120. {
  121.     switch (part) {
  122.  
  123.     case cPartWantKbdFocus:
  124.     if (kbdFocus != (VObject*) val) {
  125.         if (kbdFocus)
  126.         kbdFocus->SendDown(cIdEndKbdFocus, cPartFocusChanged, 0);
  127.         kbdFocus= (VObject*) val;
  128.         //kbdFocus->SendDown(cIdStartKbdFocus, cPartFocusChanged, 0);
  129.     }
  130.     break;
  131.  
  132.     case cPartLayoutChanged:
  133.     CalcLayout();
  134.     break;
  135.  
  136.     case cPartFocusRemove: 
  137.     if (((VObject*)val)->FindItemPtr(kbdFocus)) 
  138.         SetKbdFocus(0);
  139.     break;
  140.         
  141.     default:
  142.     break;
  143.     }
  144.     View::Control(id, part, val);
  145. }
  146.  
  147. Command *DialogView::DispatchEvents(Point lp, Token t, Clipper *vf)
  148. {    
  149.     if (t.IsKey()) {
  150.     if (kbdFocusItems && t.Code == '\t') {
  151.         DoTab(t);
  152.         return gNoChanges;
  153.     }
  154.     if (defaultButton && t.Code == '\r') {
  155.         defaultButton->Flush();
  156.         return gNoChanges;
  157.     }
  158.     }
  159.     if (kbdFocus && kbdFocus->Enabled() &&
  160.                  (t.IsCursorKey() || t.IsKey() || t.Code == eEvtRightButton))
  161.     return kbdFocus->DispatchEvents(lp, t, vf);
  162.  
  163.     if (dialogRoot)
  164.     return dialogRoot->Input(lp, t, vf);
  165.     return View::DispatchEvents(lp, t, vf);
  166. }
  167.  
  168. void DialogView::Parts(Collection *col)
  169. {
  170.     View::Parts(col);
  171.     col->Add(dialogRoot);
  172. }
  173.  
  174. //---- Menus --------------------------------------------------------------------
  175.  
  176. Menu *DialogView::GetMenu()
  177. {
  178.     if (GetNextHandler())
  179.     return View::GetMenu();
  180.     if (menu == 0)
  181.     menu= new Menu("dialog");
  182.     return menu;
  183. }
  184.  
  185. bool DialogView::HasSelection()
  186. {
  187.     bool hasSelection;
  188.     if (kbdFocus) {
  189.     kbdFocus->SendDown(cIdNone, cPartHasSelection, &hasSelection);
  190.     return hasSelection;
  191.     }
  192.     return View::HasSelection();
  193. }
  194.  
  195. Command *DialogView::DoMenuCommand(int cmd)
  196. {
  197.     if (kbdFocus) {
  198.     VObject *oldactive= kbdFocus;
  199.     kbdFocus= 0;
  200.     Command *rcmd= oldactive->DoMenuCommand(cmd);
  201.     kbdFocus= oldactive;
  202.     return rcmd;
  203.     }
  204.     return View::DoMenuCommand(cmd);
  205. }
  206.  
  207. void DialogView::AddItemWithKbdFocus(VObject* t)
  208. {
  209.     if (kbdFocusItems == 0)
  210.     kbdFocusItems= new OrdCollection();
  211.     kbdFocusItems->Add(t);
  212.     if (kbdFocus == 0)  // the first appended textitem becomes the active one
  213.     kbdFocus= t;             
  214. }
  215.  
  216. void DialogView::SetKbdFocus(VObject *vop)
  217. {
  218.     Control(cIdNone, cPartWantKbdFocus, vop);
  219.     if (kbdFocus) 
  220.     kbdFocus->SendDown(cIdStartKbdFocus, cPartFocusChanged, 0);
  221. }
  222.  
  223. void DialogView::SetDefaultButton (Button *b)
  224. {
  225.     defaultButton= b;
  226. }
  227.  
  228.  
  229. void DialogView::FindNeighbours(VObject *&left, VObject *&right, VObject *&first)
  230. {
  231.     VObject *vop, *last;
  232.     Iter next(kbdFocusItems);
  233.     first= last= left= right= 0;
  234.     bool found= FALSE;
  235.     
  236.     while (vop= (VObject*)next()) {
  237.     if (vop->Enabled() && vop->IsOpen()) {
  238.         if (first == 0)
  239.         first= vop;
  240.         if (found && right == 0)
  241.         right= vop;
  242.         if (vop == kbdFocus)
  243.         found= TRUE; 
  244.         if (!found)
  245.         left= vop;
  246.         last= vop;
  247.     }
  248.     }
  249.     if (left == 0)
  250.     left= last;
  251.     if (right == 0)
  252.     right= first;
  253. }
  254.  
  255. void DialogView::DoTab(Token t)
  256. {
  257.     VObject *first, *next, *prev, *nextKbdFocus= 0;
  258.  
  259.     FindNeighbours(prev, next, first); 
  260.     
  261.     if (!kbdFocus || !kbdFocusItems->FindPtr(kbdFocus)) // take the first enabled item
  262.     nextKbdFocus= first;
  263.     else if (t.Flags & eFlgShiftKey) 
  264.     nextKbdFocus= prev;
  265.     else 
  266.     nextKbdFocus= next;
  267.     
  268.     if (kbdFocus)   
  269.     kbdFocus->SendDown(cIdEndKbdFocus, cPartFocusChanged, 0);
  270.     kbdFocus= nextKbdFocus;
  271.     if (kbdFocus) 
  272.     kbdFocus->SendDown(cIdStartKbdFocus, cPartFocusChanged, 0);
  273. }
  274.  
  275. VObject* DialogView::RemoveItemWithKbdFocus (VObject* t)
  276. {
  277.     if (kbdFocus == t)
  278.     kbdFocus= 0;
  279.     return (VObject*) kbdFocusItems->Remove(t);
  280. }
  281.  
  282. void DialogView::EnableItem (int id, bool b)
  283. {
  284.     VObject *gop;
  285.     if (gop= FindItem(id))
  286.     gop->Enable(b, TRUE);
  287. }
  288.  
  289. VObject *DialogView::FindItem(int id)
  290. {
  291.     return dialogRoot->FindItem(id);
  292. }
  293.  
  294. void DialogView::Draw(Rectangle r)
  295. {
  296.     if (dialogRoot)
  297.     dialogRoot->DrawAll(r, FALSE);
  298. }
  299.  
  300. //---- Dialog -------------------------------------------------------------------
  301.  
  302. AbstractMetaImpl(Dialog, (TP(dw), T(actionId), 0));
  303.  
  304. Dialog::Dialog(char *title, int f, EvtHandler *eh) : DialogView(eh)
  305. {
  306.     if (f == 0)
  307.     f= eBWinDefault;
  308.     if (f & eBWinBlock)
  309.     f|= eBWinFixed;
  310.     if (title)
  311.     dw= new Window(this, gPoint_1, (WindowFlags)f, this, title);
  312.     else
  313.     dw= new BlankWin(this, this, gPoint_1, (BWinFlags)f);
  314. }
  315.  
  316. Dialog::~Dialog()
  317. {   
  318.     Object *op= dw;
  319.     dw= 0;
  320.     SafeDelete(op);
  321. }
  322.  
  323. void Dialog::SetTitle(char *title)
  324. {
  325.     if (GetWindow()->IsKindOf(Window) )
  326.     ((Window*)GetWindow())->SetTitle(title, FALSE);  // FALSE..don't redraw
  327. }
  328.  
  329. void Dialog::DoSetDefaults()
  330. {
  331. }
  332.  
  333. void Dialog::DoSave()
  334. {
  335. }
  336.  
  337. void Dialog::DoRestore() 
  338. {
  339. }
  340.  
  341. void Dialog::DoStore() 
  342. {
  343. }
  344.  
  345. void Dialog::DoSetup() 
  346. {
  347. }
  348.  
  349. Point Dialog::GetInitialPos()
  350. {
  351.     if (GetDefaultButton())
  352.     return GetDefaultButton()->contentRect.Center();
  353.     return GetExtent().Half();
  354. }
  355.  
  356. int Dialog::ShowAt(VObject *fp, Point p)
  357. {
  358.     bool b= IsModified() && !GetRoot();
  359.     Update();
  360.     if (b)
  361.     DoSetDefaults();
  362.     DoSave();
  363.     DoSetup();
  364.     dw->OpenAt(p - GetInitialPos(), fp);
  365.     return actionId;
  366. }
  367.  
  368. int Dialog::Show()
  369. {
  370.     return ShowAt(gWindow, gToken.Pos);
  371. }
  372.  
  373. int Dialog::ShowOnWindow(VObject *fp)
  374. {
  375.     return ShowAt(fp, fp->GetExtent().Half());
  376. }
  377.  
  378. void Dialog::Control(int id, int part, void *vp)
  379. {
  380.     bool veto;
  381.  
  382.     switch (id) {
  383.     case cIdDefault:
  384.     DoSetDefaults();
  385.     DoSetup();
  386.     break;
  387.     case cIdCloseBox:
  388.     dw->Close();
  389.     break;
  390.     default:
  391.     if (part == cPartAction) {
  392.         DialogView::Control(id, part, vp);
  393.         if (id != cIdCancel) {
  394.         veto= FALSE;
  395.         GetRoot()->SendDown(0, cPartValidate, &veto);
  396.         if (veto) 
  397.             return;
  398.         }
  399.         actionId= id;
  400.         dw->Close();
  401.         if (id == cIdCancel)
  402.         DoRestore();
  403.         else if (id == cIdOk)
  404.         DoStore();
  405.         return;
  406.     }
  407.     break;
  408.     }
  409.     DialogView::Control(id, part, vp);
  410. }
  411.  
  412. void Dialog::Close()
  413. {
  414.     dw->Close();
  415. }
  416.  
  417. void Dialog::InspectorId(char *buf, int sz)
  418. {
  419.     if (dw)
  420.     dw->InspectorId(buf, sz);
  421.     else
  422.     DialogView::InspectorId(buf, sz); 
  423. }
  424.